package dca.sistemascontrole.malhadecontrole;

import dca.sistemascontrole.domain.VariaveisDeControle;

/**
 *
 * @author Teles
 */
public class ControladorCascata extends MalhaDeControle {

    protected boolean usarFiltroDerivativo;
    protected boolean usarFiltroAntiWindup;
    protected MalhaFechada controladorMestre, controladorEscravo;

    public ControladorCascata(float setPoint, MalhaFechada controladorMestre, MalhaFechada controladorEscravo) {
        variaveisDeControle.setSetPoint(setPoint);
        this.controladorMestre = controladorMestre;
        this.controladorEscravo = controladorEscravo;
    }

    @Override
    public int getTipo() {
        return MalhaDeControle.MALHA_CASCATA;
    }

    public void setTw(double tw) {
        controladorMestre.setTw(tw);
        controladorEscravo.setTw(tw);
    }

    public void setGama(double gama) {
        controladorMestre.setGama(gama);
        controladorEscravo.setGama(gama);
    }

    public void setKpMestre(double kp) {
        controladorMestre.setKp(kp);
    }

    public void setKiMestre(double ki) {
        controladorMestre.setKi(ki);
    }

    public void setKdMestre(double kd) {
        controladorMestre.setKd(kd);
    }

    public void setKpEscravo(double kp) {
        controladorEscravo.setKp(kp);
    }

    public void setKiEscravo(double ki) {
        controladorEscravo.setKi(ki);
    }

    public void setKdEscravo(double kd) {
        controladorEscravo.setKd(kd);
    }

    public double getSetpoint() {
        return variaveisDeControle.getSetPoint();
    }

    public void setSetpoint(double setpoint) {
        controladorMestre.setSetpoint(setpoint);
        controladorEscravo.setSetpoint(setpoint);
        variaveisDeControle.setSetPoint(setpoint);
    }

    public void setUsarFiltroDerivativo(boolean usarFiltroDerivativo) {
        controladorMestre.setUsarFiltroDerivativo(usarFiltroDerivativo);
    }

    public void setUsarFiltroAntiWindup(boolean usarFiltroAntiWindup) {
        controladorMestre.setUsarFiltroAntiWindup(usarFiltroAntiWindup);
    }

    @Override
    public VariaveisDeControle getNextValue(long t, double nivelTanqueSuperior, double nivelTanqueInfeior) {
        double u = controladorMestre.getNextValue(t, nivelTanqueInfeior, nivelTanqueInfeior).getU();
        
        controladorEscravo.setSetpoint(u);
        VariaveisDeControle nextValue = controladorEscravo.getNextValue(t, nivelTanqueSuperior, nivelTanqueSuperior);
        
        return nextValue;
    }
}